package com.wmx.sqliteapp3.sqlite;

import cn.hutool.core.date.DateUtil;
import com.wmx.sqliteapp3.model.ResultData;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.security.SecureRandom;
import java.util.List;
import java.util.Map;

/**
 * SQLite + Spring Boot + JdbcTemplate 操作数据库
 * 1、建表脚本：static\sql\SQLite.sql
 *
 * @author wangMaoXiong
 * @version 1.0
 * @date 2025/2/22 14:27
 */
@RestController
public class PhoneController {
    /**
     * JdbcTemplate 是 core 包的核心类，用于简化 JDBC 操作，还能避免一些常见的错误，如忘记关闭数据库连接
     * Spring Boot 默认提供了数据源，默认提供了 org.springframework.jdbc.core.JdbcTemplate
     * JdbcTemplate 中会自己注入数据源，使用起来也不用再自己来关闭数据库连接
     */
    @Resource
    private JdbcTemplate jdbcTemplate;

    /**
     * 查询 iphone 表所有数据
     * http://localhost:8080/phoneList
     *
     * @return
     */
    @GetMapping("phoneList")
    public ResultData<Object> userList() {
        /**
         * 查询 iphone 表所有数据
         * List 中的1个 Map 对应数据库的 1行数据
         * Map 中的 key 对应数据库的字段名，value 对应数据库的字段值
         */
        List<Map<String, Object>> mapList = jdbcTemplate.queryForList("SELECT * FROM iphone");
        mapList.stream().filter(item -> item.get("publish_time") != null).forEach(item -> item.put("publish_time", DateUtil.formatDateTime(DateUtil.date((Long) item.get("publish_time")))));
        return ResultData.success(mapList);
    }

    /**
     * 新增 iphone 数据
     * http://localhost:8080/savePhone
     *
     * @return
     */
    @GetMapping("savePhone")
    public ResultData<Object> savePhone() {
        String sql = "INSERT INTO iphone(id,name,price,publish_time) VALUES (?,?,?,?)";
        Object[] objects = new Object[4];
        objects[0] = null;
        objects[1] = "大米S" + String.valueOf(System.currentTimeMillis()).substring(10, 12);
        objects[2] = 800 + new SecureRandom().nextFloat() * 5000;
        objects[3] = DateUtil.date().getTime();
        int update = jdbcTemplate.update(sql, objects);
        return ResultData.success(update);
    }

    /**
     * 修改 iphone 数据
     * http://localhost:8080/updatePhone/1/8888.08
     *
     * @return
     */
    @GetMapping("updatePhone/{id}/{price}")
    public ResultData<Object> updatePhone(@PathVariable(value = "id") String id,
                                          @PathVariable(value = "price") String price) {
        String sql = "UPDATE iphone SET price=? WHERE id=?";
        Object[] objects = new Object[2];
        objects[0] = price;
        objects[1] = id;
        int update = jdbcTemplate.update(sql, objects);
        return ResultData.success(update);
    }

    /**
     * 删除 iphone 数据
     * update 方法可以做查询以外的 增加、修改、删除操作
     * http://localhost:8080/deletePhone/11
     *
     * @return
     */
    @GetMapping("deletePhone/{id}")
    public ResultData<Object> deletePhone(@PathVariable Integer id) {
        String sql = "DELETE FROM iphone WHERE id=?";
        Object[] objects = new Object[1];
        objects[0] = id;
        int update = jdbcTemplate.update(sql, objects);
        return ResultData.success(update);
    }
}